home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / webbrowser.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  19KB  |  680 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Interfaces for launching and remotely controlling Web browsers.'''
  5. import os
  6. import shlex
  7. import sys
  8. import stat
  9. import subprocess
  10. import time
  11. __all__ = [
  12.     'Error',
  13.     'open',
  14.     'open_new',
  15.     'open_new_tab',
  16.     'get',
  17.     'register']
  18.  
  19. class Error(Exception):
  20.     pass
  21.  
  22. _browsers = { }
  23. _tryorder = []
  24.  
  25. def register(name, klass, instance = None, update_tryorder = 1):
  26.     '''Register a browser connector and, optionally, connection.'''
  27.     _browsers[name.lower()] = [
  28.         klass,
  29.         instance]
  30.     if update_tryorder > 0:
  31.         _tryorder.append(name)
  32.     elif update_tryorder < 0:
  33.         _tryorder.insert(0, name)
  34.     
  35.  
  36.  
  37. def get(using = None):
  38.     '''Return a browser launcher instance appropriate for the environment.'''
  39.     if using is not None:
  40.         alternatives = [
  41.             using]
  42.     else:
  43.         alternatives = _tryorder
  44.     for browser in alternatives:
  45.         if '%s' in browser:
  46.             browser = shlex.split(browser)
  47.             if browser[-1] == '&':
  48.                 return BackgroundBrowser(browser[:-1])
  49.             else:
  50.                 return GenericBrowser(browser)
  51.         browser[-1] == '&'
  52.         
  53.         try:
  54.             command = _browsers[browser.lower()]
  55.         except KeyError:
  56.             command = _synthesize(browser)
  57.  
  58.         if command[1] is not None:
  59.             return command[1]
  60.             continue
  61.         if command[0] is not None:
  62.             return command[0]()
  63.             continue
  64.     
  65.     raise Error('could not locate runnable browser')
  66.  
  67.  
  68. def open(url, new = 0, autoraise = 1):
  69.     for name in _tryorder:
  70.         browser = get(name)
  71.         if browser.open(url, new, autoraise):
  72.             return True
  73.             continue
  74.     
  75.     return False
  76.  
  77.  
  78. def open_new(url):
  79.     return open(url, 1)
  80.  
  81.  
  82. def open_new_tab(url):
  83.     return open(url, 2)
  84.  
  85.  
  86. def _synthesize(browser, update_tryorder = 1):
  87.     """Attempt to synthesize a controller base on existing controllers.
  88.  
  89.     This is useful to create a controller when a user specifies a path to
  90.     an entry in the BROWSER environment variable -- we can copy a general
  91.     controller to operate using a specific installation of the desired
  92.     browser in this way.
  93.  
  94.     If we can't create a controller in this way, or if there is no
  95.     executable for the requested browser, return [None, None].
  96.  
  97.     """
  98.     cmd = browser.split()[0]
  99.     if not _iscommand(cmd):
  100.         return [
  101.             None,
  102.             None]
  103.     
  104.     name = os.path.basename(cmd)
  105.     
  106.     try:
  107.         command = _browsers[name.lower()]
  108.     except KeyError:
  109.         return [
  110.             None,
  111.             None]
  112.  
  113.     controller = command[1]
  114.     if controller and name.lower() == controller.basename:
  115.         import copy as copy
  116.         controller = copy.copy(controller)
  117.         controller.name = browser
  118.         controller.basename = os.path.basename(browser)
  119.         register(browser, None, controller, update_tryorder)
  120.         return [
  121.             None,
  122.             controller]
  123.     
  124.     return [
  125.         None,
  126.         None]
  127.  
  128. if sys.platform[:3] == 'win':
  129.     
  130.     def _isexecutable(cmd):
  131.         cmd = cmd.lower()
  132.         if os.path.isfile(cmd) and cmd.endswith(('.exe', '.bat')):
  133.             return True
  134.         
  135.         for ext in ('.exe', '.bat'):
  136.             if os.path.isfile(cmd + ext):
  137.                 return True
  138.                 continue
  139.         
  140.         return False
  141.  
  142. else:
  143.     
  144.     def _isexecutable(cmd):
  145.         if os.path.isfile(cmd):
  146.             mode = os.stat(cmd)[stat.ST_MODE]
  147.             if mode & stat.S_IXUSR and mode & stat.S_IXGRP or mode & stat.S_IXOTH:
  148.                 return True
  149.             
  150.         
  151.         return False
  152.  
  153.  
  154. def _iscommand(cmd):
  155.     '''Return True if cmd is executable or can be found on the executable
  156.     search path.'''
  157.     if _isexecutable(cmd):
  158.         return True
  159.     
  160.     path = os.environ.get('PATH')
  161.     if not path:
  162.         return False
  163.     
  164.     for d in path.split(os.pathsep):
  165.         exe = os.path.join(d, cmd)
  166.         if _isexecutable(exe):
  167.             return True
  168.             continue
  169.     
  170.     return False
  171.  
  172.  
  173. class BaseBrowser(object):
  174.     '''Parent class for all browsers. Do not use directly.'''
  175.     args = [
  176.         '%s']
  177.     
  178.     def __init__(self, name = ''):
  179.         self.name = name
  180.         self.basename = name
  181.  
  182.     
  183.     def open(self, url, new = 0, autoraise = 1):
  184.         raise NotImplementedError
  185.  
  186.     
  187.     def open_new(self, url):
  188.         return self.open(url, 1)
  189.  
  190.     
  191.     def open_new_tab(self, url):
  192.         return self.open(url, 2)
  193.  
  194.  
  195.  
  196. class GenericBrowser(BaseBrowser):
  197.     '''Class for all browsers started with a command
  198.        and without remote functionality.'''
  199.     
  200.     def __init__(self, name):
  201.         if isinstance(name, basestring):
  202.             self.name = name
  203.             self.args = [
  204.                 '%s']
  205.         else:
  206.             self.name = name[0]
  207.             self.args = name[1:]
  208.         self.basename = os.path.basename(self.name)
  209.  
  210.     
  211.     def open(self, url, new = 0, autoraise = 1):
  212.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  213.         
  214.         try:
  215.             return not p.wait()
  216.         except OSError:
  217.             []
  218.             []
  219.             [
  220.                 self.name]
  221.             return False
  222.         except:
  223.             []
  224.  
  225.  
  226.  
  227.  
  228. class BackgroundBrowser(GenericBrowser):
  229.     '''Class for all browsers which are to be started in the
  230.        background.'''
  231.     
  232.     def open(self, url, new = 0, autoraise = 1):
  233.         cmdline = [] + [ arg.replace('%s', url) for arg in self.args ]
  234.         
  235.         try:
  236.             if sys.platform[:3] == 'win':
  237.                 p = subprocess.Popen(cmdline)
  238.             else:
  239.                 setsid = getattr(os, 'setsid', None)
  240.                 if not setsid:
  241.                     setsid = getattr(os, 'setpgrp', None)
  242.                 
  243.                 p = subprocess.Popen(cmdline, close_fds = True, preexec_fn = setsid)
  244.             return p.poll() is None
  245.         except OSError:
  246.             []
  247.             []
  248.             [
  249.                 self.name]
  250.             return False
  251.         except:
  252.             []
  253.  
  254.  
  255.  
  256.  
  257. class UnixBrowser(BaseBrowser):
  258.     '''Parent class for all Unix browsers with remote functionality.'''
  259.     raise_opts = None
  260.     remote_args = [
  261.         '%action',
  262.         '%s']
  263.     remote_action = None
  264.     remote_action_newwin = None
  265.     remote_action_newtab = None
  266.     background = False
  267.     redirect_stdout = True
  268.     
  269.     def _invoke(self, args, remote, autoraise):
  270.         raise_opt = []
  271.         if remote and self.raise_opts:
  272.             autoraise = int(bool(autoraise))
  273.             opt = self.raise_opts[autoraise]
  274.             if opt:
  275.                 raise_opt = [
  276.                     opt]
  277.             
  278.         
  279.         cmdline = [
  280.             self.name] + raise_opt + args
  281.         if remote or self.background:
  282.             inout = file(os.devnull, 'r+')
  283.         else:
  284.             inout = None
  285.         setsid = getattr(os, 'setsid', None)
  286.         if not setsid:
  287.             setsid = getattr(os, 'setpgrp', None)
  288.         
  289.         if not self.redirect_stdout or inout:
  290.             pass
  291.         p = subprocess.Popen(cmdline, close_fds = True, stdin = inout, stdout = None, stderr = inout, preexec_fn = setsid)
  292.         if remote:
  293.             time.sleep(1)
  294.             rc = p.poll()
  295.             if rc is None:
  296.                 time.sleep(4)
  297.                 rc = p.poll()
  298.                 if rc is None:
  299.                     return True
  300.                 
  301.             
  302.             return not rc
  303.         elif self.background:
  304.             if p.poll() is None:
  305.                 return True
  306.             else:
  307.                 return False
  308.         else:
  309.             return not p.wait()
  310.  
  311.     
  312.     def open(self, url, new = 0, autoraise = 1):
  313.         if new == 0:
  314.             action = self.remote_action
  315.         elif new == 1:
  316.             action = self.remote_action_newwin
  317.         elif new == 2:
  318.             if self.remote_action_newtab is None:
  319.                 action = self.remote_action_newwin
  320.             else:
  321.                 action = self.remote_action_newtab
  322.         else:
  323.             raise Error("Bad 'new' parameter to open(); " + 'expected 0, 1, or 2, got %s' % new)
  324.         args = [ arg.replace('%s', url).replace('%action', action) for arg in self.remote_args ]
  325.         success = self._invoke(args, True, autoraise)
  326.  
  327.  
  328.  
  329. class Mozilla(UnixBrowser):
  330.     '''Launcher class for Mozilla/Netscape browsers.'''
  331.     raise_opts = [
  332.         '-noraise',
  333.         '-raise']
  334.     remote_args = [
  335.         '-remote',
  336.         'openURL(%s%action)']
  337.     remote_action = ''
  338.     remote_action_newwin = ',new-window'
  339.     remote_action_newtab = ',new-tab'
  340.     background = True
  341.  
  342. Netscape = Mozilla
  343.  
  344. class Galeon(UnixBrowser):
  345.     '''Launcher class for Galeon/Epiphany browsers.'''
  346.     raise_opts = [
  347.         '-noraise',
  348.         '']
  349.     remote_args = [
  350.         '%action',
  351.         '%s']
  352.     remote_action = '-n'
  353.     remote_action_newwin = '-w'
  354.     background = True
  355.  
  356.  
  357. class Opera(UnixBrowser):
  358.     '''Launcher class for Opera browser.'''
  359.     raise_opts = [
  360.         '',
  361.         '-raise']
  362.     remote_args = [
  363.         '-remote',
  364.         'openURL(%s%action)']
  365.     remote_action = ''
  366.     remote_action_newwin = ',new-window'
  367.     remote_action_newtab = ',new-page'
  368.     background = True
  369.  
  370.  
  371. class Elinks(UnixBrowser):
  372.     '''Launcher class for Elinks browsers.'''
  373.     remote_args = [
  374.         '-remote',
  375.         'openURL(%s%action)']
  376.     remote_action = ''
  377.     remote_action_newwin = ',new-window'
  378.     remote_action_newtab = ',new-tab'
  379.     background = False
  380.     redirect_stdout = False
  381.  
  382.  
  383. class Konqueror(BaseBrowser):
  384.     '''Controller for the KDE File Manager (kfm, or Konqueror).
  385.  
  386.     See the output of ``kfmclient --commands``
  387.     for more information on the Konqueror remote-control interface.
  388.     '''
  389.     
  390.     def open(self, url, new = 0, autoraise = 1):
  391.         if new == 2:
  392.             action = 'newTab'
  393.         else:
  394.             action = 'openURL'
  395.         devnull = file(os.devnull, 'r+')
  396.         setsid = getattr(os, 'setsid', None)
  397.         if not setsid:
  398.             setsid = getattr(os, 'setpgrp', None)
  399.         
  400.         
  401.         try:
  402.             p = subprocess.Popen([
  403.                 'kfmclient',
  404.                 action,
  405.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull)
  406.         except OSError:
  407.             pass
  408.  
  409.         p.wait()
  410.         return True
  411.         
  412.         try:
  413.             p = subprocess.Popen([
  414.                 'konqueror',
  415.                 '--silent',
  416.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  417.         except OSError:
  418.             pass
  419.  
  420.         if p.poll() is None:
  421.             return True
  422.         
  423.         
  424.         try:
  425.             p = subprocess.Popen([
  426.                 'kfm',
  427.                 '-d',
  428.                 url], close_fds = True, stdin = devnull, stdout = devnull, stderr = devnull, preexec_fn = setsid)
  429.         except OSError:
  430.             return False
  431.  
  432.         return p.poll() is None
  433.  
  434.  
  435.  
  436. class Grail(BaseBrowser):
  437.     
  438.     def _find_grail_rc(self):
  439.         import glob as glob
  440.         import pwd as pwd
  441.         import socket as socket
  442.         import tempfile as tempfile
  443.         tempdir = os.path.join(tempfile.gettempdir(), '.grail-unix')
  444.         user = pwd.getpwuid(os.getuid())[0]
  445.         filename = os.path.join(tempdir, user + '-*')
  446.         maybes = glob.glob(filename)
  447.         if not maybes:
  448.             return None
  449.         
  450.         s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  451.         for fn in maybes:
  452.             
  453.             try:
  454.                 s.connect(fn)
  455.             except socket.error:
  456.                 
  457.                 try:
  458.                     os.unlink(fn)
  459.                 except IOError:
  460.                     pass
  461.                 except:
  462.                     None<EXCEPTION MATCH>IOError
  463.                 
  464.  
  465.                 None<EXCEPTION MATCH>IOError
  466.  
  467.             return s
  468.         
  469.  
  470.     
  471.     def _remote(self, action):
  472.         s = self._find_grail_rc()
  473.         if not s:
  474.             return 0
  475.         
  476.         s.send(action)
  477.         s.close()
  478.         return 1
  479.  
  480.     
  481.     def open(self, url, new = 0, autoraise = 1):
  482.         if new:
  483.             ok = self._remote('LOADNEW ' + url)
  484.         else:
  485.             ok = self._remote('LOAD ' + url)
  486.         return ok
  487.  
  488.  
  489.  
  490. def register_X_browsers():
  491.     if _iscommand('gconftool-2'):
  492.         gc = 'gconftool-2 -g /desktop/gnome/url-handlers/http/command 2>/dev/null'
  493.         out = os.popen(gc)
  494.         commd = out.read().strip()
  495.         retncode = out.close()
  496.         if retncode is None and commd:
  497.             register('gnome', None, BackgroundBrowser(shlex.split(commd)))
  498.         
  499.     
  500.     if _iscommand('x-www-browser'):
  501.         register('x-www-browser', None, BackgroundBrowser('x-www-browser'))
  502.     
  503.     for browser in ('mozilla-firefox', 'firefox', 'iceweasel', 'iceape', 'mozilla-firebird', 'firebird', 'seamonkey', 'mozilla', 'netscape'):
  504.         if _iscommand(browser):
  505.             register(browser, None, Mozilla(browser))
  506.             continue
  507.     
  508.     if _iscommand('kfm'):
  509.         register('kfm', Konqueror, Konqueror('kfm'))
  510.     elif _iscommand('konqueror'):
  511.         register('konqueror', Konqueror, Konqueror('konqueror'))
  512.     
  513.     for browser in ('galeon', 'epiphany'):
  514.         if _iscommand(browser):
  515.             register(browser, None, Galeon(browser))
  516.             continue
  517.     
  518.     if _iscommand('skipstone'):
  519.         register('skipstone', None, BackgroundBrowser('skipstone'))
  520.     
  521.     if _iscommand('opera'):
  522.         register('opera', None, Opera('opera'))
  523.     
  524.     if _iscommand('mosaic'):
  525.         register('mosaic', None, BackgroundBrowser('mosaic'))
  526.     
  527.     if _iscommand('grail'):
  528.         register('grail', Grail, None)
  529.     
  530.  
  531. if os.environ.get('DISPLAY'):
  532.     register_X_browsers()
  533.  
  534. if os.environ.get('TERM'):
  535.     if _iscommand('www-browser'):
  536.         register('www-browser', None, GenericBrowser('www-browser'))
  537.     
  538.     if _iscommand('links'):
  539.         register('links', None, GenericBrowser('links'))
  540.     
  541.     if _iscommand('elinks'):
  542.         register('elinks', None, Elinks('elinks'))
  543.     
  544.     if _iscommand('lynx'):
  545.         register('lynx', None, GenericBrowser('lynx'))
  546.     
  547.     if _iscommand('w3m'):
  548.         register('w3m', None, GenericBrowser('w3m'))
  549.     
  550.  
  551. if sys.platform[:3] == 'win':
  552.     
  553.     class WindowsDefault(BaseBrowser):
  554.         
  555.         def open(self, url, new = 0, autoraise = 1):
  556.             os.startfile(url)
  557.             return True
  558.  
  559.  
  560.     _tryorder = []
  561.     _browsers = { }
  562.     for browser in ('firefox', 'firebird', 'seamonkey', 'mozilla', 'netscape', 'opera'):
  563.         if _iscommand(browser):
  564.             register(browser, None, BackgroundBrowser(browser))
  565.             continue
  566.     
  567.     register('windows-default', WindowsDefault)
  568.  
  569.  
  570. try:
  571.     import ic
  572. except ImportError:
  573.     pass
  574.  
  575.  
  576. class InternetConfig(BaseBrowser):
  577.     
  578.     def open(self, url, new = 0, autoraise = 1):
  579.         ic.launchurl(url)
  580.         return True
  581.  
  582.  
  583. register('internet-config', InternetConfig, update_tryorder = -1)
  584. if sys.platform == 'darwin':
  585.     
  586.     class MacOSX(BaseBrowser):
  587.         '''Launcher class for Aqua browsers on Mac OS X
  588.  
  589.         Optionally specify a browser name on instantiation.  Note that this
  590.         will not work for Aqua browsers if the user has moved the application
  591.         package after installation.
  592.  
  593.         If no browser is specified, the default browser, as specified in the
  594.         Internet System Preferences panel, will be used.
  595.         '''
  596.         
  597.         def __init__(self, name):
  598.             self.name = name
  599.  
  600.         
  601.         def open(self, url, new = 0, autoraise = 1):
  602.             if not "'" not in url:
  603.                 raise AssertionError
  604.             if ':' not in url:
  605.                 url = 'file:' + url
  606.             
  607.             new = int(bool(new))
  608.             if self.name == 'default':
  609.                 script = 'open location "%s"' % url.replace('"', '%22')
  610.             elif self.name == 'OmniWeb':
  611.                 toWindow = ''
  612.             else:
  613.                 toWindow = 'toWindow %d' % (new - 1)
  614.             cmd = 'OpenURL "%s"' % url.replace('"', '%22')
  615.             script = 'tell application "%s"\n                                activate\n                                %s %s\n                            end tell' % (self.name, cmd, toWindow)
  616.             osapipe = os.popen('osascript', 'w')
  617.             if osapipe is None:
  618.                 return False
  619.             
  620.             osapipe.write(script)
  621.             rc = osapipe.close()
  622.             return not rc
  623.  
  624.  
  625.     register('MacOSX', None, MacOSX('default'), -1)
  626.  
  627. if sys.platform[:3] == 'os2' and _iscommand('netscape'):
  628.     _tryorder = []
  629.     _browsers = { }
  630.     register('os2netscape', None, GenericBrowser([
  631.         'start',
  632.         'netscape',
  633.         '%s']), -1)
  634.  
  635. if 'BROWSER' in os.environ:
  636.     _userchoices = os.environ['BROWSER'].split(os.pathsep)
  637.     _userchoices.reverse()
  638.     for cmdline in _userchoices:
  639.         if cmdline != '':
  640.             _synthesize(cmdline, -1)
  641.             continue
  642.     
  643.     cmdline = None
  644.     del cmdline
  645.     del _userchoices
  646.  
  647.  
  648. def main():
  649.     import getopt as getopt
  650.     usage = 'Usage: %s [-n | -t] url\n    -n: open new window\n    -t: open new tab' % sys.argv[0]
  651.     
  652.     try:
  653.         (opts, args) = getopt.getopt(sys.argv[1:], 'ntd')
  654.     except getopt.error:
  655.         msg = None
  656.         print >>sys.stderr, msg
  657.         print >>sys.stderr, usage
  658.         sys.exit(1)
  659.  
  660.     new_win = 0
  661.     for o, a in opts:
  662.         if o == '-n':
  663.             new_win = 1
  664.             continue
  665.         if o == '-t':
  666.             new_win = 2
  667.             continue
  668.     
  669.     if len(args) != 1:
  670.         print >>sys.stderr, usage
  671.         sys.exit(1)
  672.     
  673.     url = args[0]
  674.     open(url, new_win)
  675.     print '\x07'
  676.  
  677. if __name__ == '__main__':
  678.     main()
  679.  
  680.